/**
 * 通用js方法封装处理
 * Copyright (c) 2019
 */

// 日期格式化
export function parseTime(time, pattern) {
 if (arguments.length === 0 || !time) {
  return null
 }
 const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
 let date
 if (typeof time === 'object') {
  date = time
 } else {
  if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
   time = parseInt(time)
  } else if (typeof time === 'string') {
   time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), '');
  }
  if ((typeof time === 'number') && (time.toString().length === 10)) {
   time = time * 1000
  }
  date = new Date(time)
 }
 const formatObj = {
  y: date.getFullYear(),
  m: date.getMonth() + 1,
  d: date.getDate(),
  h: date.getHours(),
  i: date.getMinutes(),
  s: date.getSeconds(),
  a: date.getDay()
 }
 const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
  let value = formatObj[key]
  // Note: getDay() returns 0 on Sunday
  if (key === 'a') {
   return ['日', '一', '二', '三', '四', '五', '六'][value]
  }
  if (result.length > 0 && value < 10) {
   value = '0' + value
  }
  return value || 0
 })
 return time_str
}

// 表单重置
export function resetForm(refName) {
	if (this.$refs[refName]) {
		let form = this.$refs[refName]
		form.resetFields();
		// 处理自定义组件resetField
		form.$children.forEach(formItem => {
			formItem.$children.forEach(item => {
				item.resetField && item.resetField()
			})
		})
	}
}

// 添加日期范围
export function addDateRange(params, dateRange, propName) {
 let search = params;
 search.params = typeof (search.params) === 'object' && search.params !== null && !Array.isArray(search.params) ? search.params : {};
 dateRange = Array.isArray(dateRange) ? dateRange : [];
 if (typeof (propName) === 'undefined') {
  search.params['beginTime'] = dateRange[0];
  search.params['endTime'] = dateRange[1];
 } else {
  search.params['begin' + propName] = dateRange[0];
  search.params['end' + propName] = dateRange[1];
 }
 return search;
}

// 回显数据字典
export function selectDictLabel(datas, value) {
 var actions = [];
 Object.keys(datas).some((key) => {
  if (datas[key].dictValue == ('' + value)) {
   actions.push(datas[key].dictLabel);
   return true;
  }
 })
 return actions.join('');
}

// 回显数据字典（字符串数组）
export function selectDictLabels(datas, value, separator) {
 var actions = [];
 var currentSeparator = undefined === separator ? "," : separator;
 var temp = value.split(currentSeparator);
 Object.keys(value.split(currentSeparator)).some((val) => {
  Object.keys(datas).some((key) => {
   if (datas[key].dictValue == ('' + temp[val])) {
    actions.push(datas[key].dictLabel + currentSeparator);
   }
  })
 })
 return actions.join('').substring(0, actions.join('').length - 1);
}



// 字符串格式化(%s )
export function sprintf(str) {
 var args = arguments, flag = true, i = 1;
 str = str.replace(/%s/g, function () {
  var arg = args[i++];
  if (typeof arg === 'undefined') {
   flag = false;
   return '';
  }
  return arg;
 });
 return flag ? str : '';
}

// 转换字符串，undefined,null等转化为""
export function praseStrEmpty(str) {
 if (!str || str == "undefined" || str == "null") {
  return "";
 }
 return str;
}

/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 * @param {*} filterId 过滤接点ID,避免变成环 默认 null
 */
export function handleTree(data, id, parentId, children, filterId) {
 let config = {
  id: id || 'id',
  parentId: parentId || 'parentId',
  childrenList: children || 'children'
 };

 var childrenListMap = {};
 var nodeIds = {};
 var tree = [];

 for (let d of data) {
  let nodeId = d[config.id];
  if(nodeId == filterId){
   continue;
  }
  let parentId = d[config.parentId];
  if (childrenListMap[parentId] == null) {
   childrenListMap[parentId] = [];
  }

  nodeIds[d[config.id]] = d;
  childrenListMap[parentId].push(d);
 }

 for (let d of data) {
  let parentNodeId = d[config.parentId];
  let nodeId = d[config.id];
  if(nodeId == filterId){
    continue;
  }
  if (nodeIds[parentNodeId] == null) {
   tree.push(d);
  }
 }

 for (let t of tree) {
  adaptToChildrenList(t);
 }

 function adaptToChildrenList(o) {
  if (childrenListMap[o[config.id]] !== null) {
   o[config.childrenList] = childrenListMap[o[config.id]];
  }
  if (o[config.childrenList]) {
   for (let c of o[config.childrenList]) {
    adaptToChildrenList(c);
   }
  }
 }

 return tree;
}
